/***************************************************************************************************
  Copyright(C)   2011-8-24
  All rights reserved.
  File Name: pixplaylabel.h

  Description:播放图片模块
              继承自QLabel,一般只需要 设置它的位置和设置播放内容列表,然后start
              可以自己调节它的播放方式,共有5种播放方式,如果想要用百味窗模式的话，播放时间不能少于3秒


  ***************************************************************************************************/

#ifndef PixPlayLabel_H
#define PixPlayLabel_H

#include <QLabel>
#include <QPixmap>
#include <QFileInfoList>
#include <QTimer>
#include <QImage>
#include <QLinearGradient>
#include <QList>

#include "windowblindsitem.h"
#include "environment.h"
#include "log.h"

extern QString g_installPath;

//以下的时间设定全部都是以毫秒计算的，K值 则是在 1000毫秒/K 来得到相应的变化时间
//飞入时间变化K值
#define FLYTIMERK               25

//旋转的变化时间变化K值
#define RORATETIMERK            10

//百叶窗的变化时间K值
#define WINDOWBLINDTIMEK        4

//淡化的变化时间K值
#define FADEOUTK                20

//图片完全时的显示时间
#define SHOWTIME                1000

//旋转的角度
#define RORATEDEGREES           -180

//结束间隔时间
#define ENDTIME                  2000

#define PLAYTIME                 2000

const int maxBlindsNum = 32; // 最大的百叶窗数


typedef enum
{
    NORMALTYPE,         //普通播放方式，直接显示图片，无其它效果
    FLYTYPE,            //飞入模式
    RORATETYPE,         //旋转模式
    WINDOWBLINDTYPE,    //百叶窗模式
    FADEOUTTYPE,        //淡出模式
    OTHERTYPE
} PLAYTYPE;

class PixPlayLabel : public QLabel
{
    LOG4QT_DECLARE_QCLASS_LOGGER

    Q_OBJECT
public:
    explicit PixPlayLabel(uint number = 0, QWidget *parent = 0);
    ~PixPlayLabel();

    void initList();

    void updatePlayCntList(const QList<ContentStruct>& cntStructList);
    void setPlayCntList(const QList<ContentStruct>& cntStructList);

    void setGeometry(int x, int y, int w, int h);    //设置Label位置
    void setPlayType(PLAYTYPE emPlayType);           //设置播放方式
    bool start();
    bool stop();

    bool isStop();

    void playTypeStart(PLAYTYPE emPlayType);

protected:
    void paintEvent(QPaintEvent *);
    void timerEvent(QTimerEvent *);
    void showEvent(QShowEvent *);
    void hideEvent(QHideEvent *);

private:
    bool isPlayStop;
    bool endFlag;
    QPixmap mPixmap;

    QImage mImg;

    QFileInfoList mPixFileInfoList;
    QTimer *mFlyTimer;
    QTimer *showTimer;
    QTimer *rotateTimer;
    QTimer *wBTImer;
    QTimer *foTimer;
    QTimer *mNormalTimer;
    QTimer *stopTimer;


    PLAYTYPE playType;      //播放方式

    int mPixNum;            //图片号，当时显示图片号
    int mTimeId;            //间隔时间

    int mFlyPosK;           //飞入效果坐标K值
    int rorateDegrees;      //旋转角度
    qreal openness;         //淡出模式的 透明度


    double mWidthK;         //mWidthK 界面大小的系数--K值

    QList<ContentStruct> cntList;
    QList<ContentStruct> reTainCntList;
    int cntListCount;                   //列表内容数
    int mPlayNum;                       //图片播放序号
    int playDuration;                   //播放持续时间

    /***************************************
     mTimerK:  定时器系数 --- k值

     根据1S和K值进行相应的计算（1/k）得出真正的定时器计时时间
    *******************************************/
    int mTimerK;

    int mWidth;             //界面宽度
    int mHeight;            //界面高度

    uint mNumber;           //本身的编号

    bool isGifPix;          //是否GIF图片文件，true则是，false否

    int showTime;           //显示时间

    bool isPixChange;       //图片是否有改变

    //百味窗叶子
    WindowBlindsItem* wbItem[maxBlindsNum];

    QMovie *movie;

private:
    void init();
    void windowBlindsPlay();

    void playGif();

signals:
    void playFinish(uint typeID, uint number, long msg = 0);

private slots:
    void flyTimerSlot();
    void showTimerSlot();
    void rorateTimerSlot();
    void windowBlindsTimerSlot();
    void fadeOutTimerSlot();
    void normalTimerSlot();


    void changePix();


};

#endif // PixPlayLabel_H
